
/**
 * 公用的方法类
 *
 * @class common.tools
 */
let Tools = {}

// 将 Date 转化为指定格式的String
// 月(M)、日(d)、小时(h)、分(m)、秒(s) 可以用 1-2 个占位符
// 年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
// 例子：
// DateFormat(new Date(), "yyyy-MM-dd HH:mm:ss.S") ==> 2006-07-02 08:09:04.423
// DateFormat(new Date(), "yyyy-M-d H:m:s.S")      ==> 2006-7-2 8:9:4.18
Tools.DateFormat = (date, fmt) => {
  let o = {
    'M+': date.getMonth() + 1, // 月份
    'd+': date.getDate(), // 日
    'H+': date.getHours(), // 小时
    'm+': date.getMinutes(), // 分
    's+': date.getSeconds(), // 秒
    'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
    'S': date.getMilliseconds() // 毫秒
  };
  if (/(y+)/.test(fmt)) {
    fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
  }
  for (var k in o) {
    if (new RegExp('(' + k + ')').test(fmt)) {
      fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)));
    }
  }
  return fmt;
}

/*
 * 将过长的数据进行显示的优化
 * @param num 需要format的数据
 */
Tools.longNumFormat = num => {
  let positive = num >= 0 ? 1 : 0;
  num = Math.abs(num)
  let numStr = num.toString()
  if (num < 10000) {
    numStr = Tools.decimalFormat(num, 0)
  } else if (num >= 10000 && num < 1000000) {
    let temp = num / 10000
    numStr = Tools.decimalFormat(temp, 2) + '万'
  } else if (num >= 1000000 && num < 10000000) {
    let temp = num / 10000
    numStr = Tools.decimalFormat(temp, 1) + '万'
  } else if (num >= 10000000 && num < 100000000) {
    let temp = num / 10000
    numStr = Tools.decimalFormat(temp, 0) + '万'
  } else if (num >= 100000000 && numStr.length < 11) {
    let temp = num / 100000000
    numStr = Tools.decimalFormat(temp, 2) + '亿'
  } else if (numStr.length >= 11 && numStr.length < 12) {
    let temp = num / 100000000
    numStr = Tools.decimalFormat(temp, 1) + '亿'
  } else {
    let temp = num / 100000000
    numStr = Tools.decimalFormat(temp, 0) + '亿'
  }
  return positive ? numStr : '-' + numStr
}

// 精确浮点数计算
Tools.AccMath = {
  div: function (arg1, arg2) {
    var s1 = arg1.toString();
    var s2 = arg2.toString();
    var m = 0;
    try {
      m = s2.split('.')[1].length;
    } catch (e) { }
    try {
      m -= s1.split('.')[1].length;
    } catch (e) { }
    return (s1.replace('.', '') - 0) / (s2.replace('.', '') - 0) * Math.pow(10, m);
  },

  mul: function (arg1, arg2) {
    var s1 = arg1.toString();
    var s2 = arg2.toString();
    var m = 0;
    try {
      m += s1.split('.')[1].length;
    } catch (e) { }
    try {
      m += s2.split('.')[1].length;
    } catch (e) { }
    return (s1.replace('.', '') - 0) * (s2.replace('.', '') - 0) / Math.pow(10, m);
  },

  add: function (arg1, arg2) {
    var r1 = 0;
    var r2 = 0;
    try {
      r1 = arg1.toString().split('.')[1].length;
    } catch (e) { }
    try {
      r2 = arg2.toString().split('.')[1].length;
    } catch (e) { }
    var m = Math.pow(10, Math.max(r1, r2));
    return (Math.round(arg1 * m) + Math.round(arg2 * m)) / m;
  },

  sub: function (arg1, arg2) {
    return this.accAdd(arg1, -arg2);
  }
};

/*
 * 对数据保留几位小数做处理
 * @param num 需要format的数据
 * @param decimal 需要保留的小数点位数
 */
Tools.decimalFormat = (num, decimal) => {
  if (decimal === 1 || decimal === '1') {
    num = num.toFixed(1)
  } else if (decimal === 2 || decimal === '2') {
    num = num.toFixed(2)
  } else {
    num = parseInt(num)
  }
  return num
}

module.exports = Tools
